<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            ToPrimitive方法:这是s中每个值隐含的自带的方法，用来将值(无论是基本类型值还是对象)转换为基本类型值.如果值为基本类型，则直接返回值本身;
            如果值为对象，其看起来大概是这样:
                ToPrimitive(obj,type)
                obj-->需要转换的对象type-->期望的结果类型
                type的值可以为number或者string, 默认情况下为number
                1. 当type为number时规则如下:
                    (1)调用obj的valueof方法, 如果为原始值, 则返回, 否则下一步
                    (2)调用obj的toString方法，如果为原始值，则返回，否则下一步
                    (3)抛出TypeError异常
                2. 当type为string时规则如下:
                    (1)调用obj的toString方法, 如果为原始值，则返回，否则下一步
                    (2)调用obj的valueof方法, 如果为原始值，则返回，否则下一步
                    (3)抛出TypeError异常
        */ 

        function objToNumber(value){
            return Number(value.valueOf().toString());
        }
        console.log(objToNumber([]));
        console.log(objToNumber({}));

        console.log('-----------------------------');

        // + 的操作符的两边至少有一个为字符串的时候，两边的变量都会被隐式转换为字符串，其他情况下两边的变量都会被转换为数字
        console.log(1+'23');//'123'
        console.log(1+false);//1
        console.log('1'+false);//'1false'
        console.log(true+false);//1

        console.log('-----------------------------');

        // -、*、/ 这三个操作符会把两边都转换为数字
        console.log(25-'23');//2
        console.log(1*false);//0
        console.log(1/'aa');//NaN

        console.log('-----------------------------');

        // 对于 == 操作符来说
        console.log(3 == true);// false，因为true转换为数值类型是1，很明显不相等
        console.log('0' == false);// true，'0'-->0，false-->0
        console.log('0' == 0);//true,'0'-->0

        console.log('-----------------------------');

        // 对于 < 和 > 比较符, 按照字母的排序顺序进行比较，其他情况下转换为数字
        console.log('c' < 'b');//false 因为c是第三个字母，b是第二个，3大于2所以c大于b
        console.log('de' < 'fg');//true 因为f>g
        console.log('12' < 13);//true 很明显，12肯定小于13
        console.log(false < -1);//false 很明显，0是大于-1的

        console.log('-----------------------------');

        // 因为对象类型的数据被隐式转换为数字后是NaN，无论 2<{}还是2>{}，都会被判为false
        console.log(2 < {});//false
        console.log(2 > {});//false
    </script> 
</body>
</html>